package at.ac.univie.bi.transformation.controller;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import at.ac.univie.bi.transformation.model.input.AbstractInputEntity;
import at.ac.univie.bi.transformation.model.input.Krankenhausaufenthalt;
import at.ac.univie.bi.transformation.model.input.KrankenhausaufenthaltLeistung;
import at.ac.univie.bi.transformation.model.input.Leistung;
import at.ac.univie.bi.transformation.model.input.Medication;
import at.ac.univie.bi.transformation.model.input.Patient;
import at.ac.univie.bi.transformation.model.output.PCAP;
import at.ac.univie.bi.transformation.model.output.PCAPValue;
import at.ac.univie.bi.transformation.model.output.PCP;
import at.ac.univie.bi.transformation.model.output.PCPValue;
import at.ac.univie.bi.transformation.model.output.ProcessCaseActivity;
import at.ac.univie.bi.transformation.service.input.KHALeistungService;
import at.ac.univie.bi.transformation.service.input.KHAService;
import at.ac.univie.bi.transformation.service.input.LeistungService;
import at.ac.univie.bi.transformation.service.output.PCAPService;
import at.ac.univie.bi.transformation.service.output.PCAPVService;
import at.ac.univie.bi.transformation.service.output.PCAService;
import at.ac.univie.bi.transformation.service.output.PCPService;
import at.ac.univie.bi.transformation.service.output.PCPVService;
import at.ac.univie.bi.transformation.service.output.ProcessCaseService;

public class OutputController {
	private ProcessCaseService pcservice;
	private PCPService pcpservice;
	private PCPVService pcpvservice;
	private PCAService pcaservice;
	private PCAPService pcapservice;
	private PCAPVService pcapvservice;
	
	private KHAService khaservice;
	private LeistungService leistungservice;
	private KHALeistungService khaLeistungservice;
	
	
	public OutputController(){
		pcservice = new ProcessCaseService();
		pcpservice = new PCPService();
		pcpvservice = new PCPVService();
		pcaservice = new PCAService();
		pcapservice = new PCAPService();
		pcapvservice = new PCAPVService();
		khaservice = new KHAService();
		leistungservice = new LeistungService();
		khaLeistungservice = new KHALeistungService();
	}
	
	public void transformPatients(List<Patient> patients){
	
		for (int i = 0; i < patients.size(); i++) {			
			Patient p = patients.get(i);
			int processCaseId;
			
			if (p.oldidIsSet()) {
				processCaseId = pcservice.createProcessCase(p.getOldid());
			} else {
				processCaseId = createProcessCase();
			}
			
			createProcessCaseParameter("Vorname", processCaseId, p.getFirstname());
			createProcessCaseParameter("Nachname", processCaseId, p.getLastname());
			createProcessCaseParameter("Geburtsjahr", processCaseId, Integer.toString(p.getBirthdate()));
			
			if( p.sexIsSet() )
				createProcessCaseParameter("Geschlecht", processCaseId, Integer.toString(p.getBirthdate()));
			
		}
	}

	public int createProcessCase(){
		
		int pcid = pcservice.createBlankProcessCase();
		return pcid;
	}
	

	public void createProcessCaseParameter(String paraName, int processCaseId, String pcpValue){
		int parameterId = getParameterId(paraName);
		
		//create pcp
		PCP pcp = new PCP();
		pcp.setParameterid(parameterId);
		pcp.setProcesscaseid(processCaseId);
		int pcpid = pcpservice.save(pcp);
		
		//create pcpvalue
		PCPValue pcpv = new PCPValue();
		pcpv.setPcpid(pcpid);
		pcpv.setValue(pcpValue);
		
		pcpvservice.save(pcpv);
	}
	
	public int getParameterId(String name){
		return pcservice.getParameterId(name);
	}
	
	public void showProcessCases(){
		pcservice.listProcessCases();
	}
	
	public void showProcessCaseActivities(){
		pcaservice.listActivities();
	}
	
	public void transfromMedications(List<Medication> medications) {
		for (Medication med : medications) {
			ProcessCaseActivity pca = new ProcessCaseActivity();
			// dirty hard activity id
			pca.setActivityId(1);
			pca.setProcesscaseId(med.getPatientId());
			// zero timestamp
			Timestamp ts = Timestamp.valueOf("0000-01-01 00:00:00");
			pca.setStarttime(ts);
			pca.setStoptime(ts);
			int pcaId = createPCA(pca);
			createPCAP("Bezeichnung",pcaId, med.getBezeichnung());
			createPCAP("Ausgabe",pcaId, med.getAusgabe().toString());
			createPCAP("Dosis",pcaId, String.valueOf(med.getDosis()));
		}
		
	}
	
	public void transformKHALeistungen(List<Krankenhausaufenthalt> khAufenthalte) {
		for (Krankenhausaufenthalt kha : khAufenthalte) {
			
			// get corresponding Krankenhausaufenthalt
			/*
			int khaId = khaLeistung.getKhaId();
			Krankenhausaufenthalt kha = khaservice.selectKHAById(khaId);
			*/
			
			
			//create ProcessCaseActivity for Krankenhausaufenthalt
			ProcessCaseActivity pca = new ProcessCaseActivity();
			pca.setActivityId(1);
			pca.setProcesscaseId(kha.getPatientId());
			pca.setStarttime(kha.getAufnahme());
			pca.setStoptime(kha.getEntlassung());
			
			//save pca and get id
			int pcaId = createPCA(pca);
			
			//get corresponding KHALeistungen
			List<KrankenhausaufenthaltLeistung> khaLeistungen = khaLeistungservice.selectKHALeistungenByKHAId(kha.getId());
			
			// get corresponding Leistungen
			List<Leistung> leistungen = new ArrayList<Leistung>();
			
			for (KrankenhausaufenthaltLeistung khaLeistung : khaLeistungen) {
				
				Leistung leistung = new Leistung();
				leistung = leistungservice.selectLeistungById(khaLeistung.getLeistungId());
				
				leistungen.add(leistung);
								
			}
			
			//create PCAP for corresponding Leistungen
			
			for (Leistung leistung : leistungen) {
				
				createPCAP("Leistungscode", pcaId, leistung.getLeistungscode());
				createPCAP("Bezeichnung", pcaId, leistung.getBezeichnung());
				
				
			}	
			
			
		}
		
		
	}
	
	public int createPCA(ProcessCaseActivity pca) {
		return pcaservice.save(pca);		
	}
	
	public void createPCAP(String paraName, int pcaId, String papValue) {
		int parameterId = getParameterId(paraName);
		
		//create pcap
		PCAP pcap = new PCAP();
		pcap.setParameterid(parameterId);
		pcap.setProcesscaseactivityId(pcaId);
		int pcapid = pcapservice.save(pcap);
		
		//create pcapValue
		PCAPValue pcapValue = new PCAPValue();
		pcapValue.setPcaId(pcapid);
		pcapValue.setPcapValue(papValue);
		pcapvservice.save(pcapValue);	
		
	}
	
	public static boolean isInteger(String s) {
	    try { 
	        Integer.parseInt(s); 
	    } catch(NumberFormatException e) { 
	        return false; 
	    }
	    // only got here if we didn't return false
	    return true;
	}

	public void transformExcelMedications(List<Medication> medicationExcel) {

		System.out.print("Welcome to Nirvanaaaaaaaa....");
	}

	public void transformExcelLeistungen(List<Leistung> leistungExcel) {

		System.out.print("Welcome to Nirvanaaaaaaaa....");
	}
}
